package pokeronlab_2014;


import java.util.HashMap;
import java.util.prefs.InvalidPreferencesFormatException;

import libsvm.svm;
import libsvm.svm_model;
import libsvm.svm_node;

/**
 * Opponent modeller osztály
 * 
 * @author andras
 * 
 */
public class OpponentModeller {
	
	/**
	 * Az éppen használt osztályozókat tároló map
	 */
	HashMap<String, svm_model> actualClassifiers;
	
	/**
	 * A tanítás intervallumát állítja be (hogy hány tanítópontonként legyen).
	 */
	int teachInterval;
	
	/**
	 * A tanítás során felhasznált játékok száma
	 */
	int usedGamesNumber;
	
	/**
	 *  Az svm_model-eket éppen előállító objektum.
	 */
	SVMClassifierFactory actualFactory;
	
	/**
	 * Inicializálja az éppen használt osztályozókat a megadott játékosokra.
	 */
	boolean updateClassifiers(String[] names, int stepsPlayed){
		if(stepsPlayed >= teachInterval){
			for(String n : names){
				Database.getInstance().getPoints(n, teachInterval);	
			}
			return true;
		}
		else{
			return false;
		}
	}
	
	/**
	 * Default konstruktor
	 */
	public OpponentModeller(){
		actualFactory = new SVMClassifierFactory();
		try {
			//lekérjük a teachInterval értékét
			teachInterval = Integer.parseInt(ConfigManager.getInstance().getValue("teachInterval"));
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidPreferencesFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * @param data Az SVM osztályozó bemenete
	 * @param playerName A játékos neve
	 * @return Az ellenfél valószínűsített lépése.
	 */
	public int getResponse(SVMClassifierData data, String playerName, int stage) {
		
		svm_model actualModel = actualClassifiers.get(playerName);
		//svm csomópont létrehozása bemenetnek a predikcióhoz
		svm_node inputNodes[] = new svm_node[137];
		for(int j = 0; j < 136; j++){
			inputNodes[j].value = data.getIntData(j);
		}
		inputNodes[136].value = stage;
		//visszaadjuk a jósolt értéket
		return (int)svm.svm_predict(actualModel, inputNodes);
	}
}
